package com.beta.cust.bind.datasync.dto;

import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
public class WeixinUserDetailDto extends WeixinBaseRespDto{

    /**
     * 成员UserID。对应管理端的帐号
     */
    @JsonAlias("userid")
    private String userId;

    /**
     * 成员名称；第三方不可获取，调用时返回userid以代替name；代开发自建应用需要管理员授权才返回；对于非第三方创建的成员，第三方通讯录应用也不可获取；未返回名称的情况需要通过通讯录展示组件来展示名字
     */
    private String name;

    /**
     * 成员所属部门id列表，仅返回该应用有查看权限的部门id
     */
    private String department;

    /**
     * 部门内的排序值，默认为0。数量必须和department一致，数值越大排序越前面。值范围是[0, 2^32)
     */
    private String order;

    /**
     * 职务信息；代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    private String position;

    /**
     * 手机号码，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    private String mobile;

    /**
     * 性别。0表示未定义，1表示男性，2表示女性
     */
    private String gender;


    /**
     * 邮箱，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    private String email;

    /**
     * 企业邮箱，代开发自建应用不返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取；上游企业不可获取下游企业成员该字段
     */
    @JsonAlias("biz_mail")
    private String bizMail;

    /**
     * 表示在所在的部门内是否为上级。0-否；1-是。是一个列表，数量必须与department一致。第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    @JsonAlias("is_leader_in_dept")
    private String isLeaderInDept;

    /**
     * 直属上级UserID，返回在应用可见范围内的直属上级列表，最多有五个直属上级；第三方通讯录应用或者授权了“组织架构信息-应用可获取可见范围内成员组织架构信息-直属上级”权限的第三方应用可获取；对于非第三方创建的成员，第三方通讯录应用不可获取；上游企业不可获取下游企业成员该字段；代开发自建应用不可获取该字段
     */
    @JsonAlias("direct_leader")
    private String directLeader;

    /**
     * 头像url。 第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    private String avatar;

    /**
     * 头像缩略图url。第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    @JsonAlias("thumb_avatar")
    private String thumbAvatar;

    /**
     * 座机。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    private String telephone;

    /**
     * 别名；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    private String alias;

    /**
     * 激活状态: 1=已激活，2=已禁用，4=未激活，5=退出企业。
     * 已激活代表已激活企业微信或已关注微工作台（原企业号）。未激活代表既未激活企业微信又未关注微工作台（原企业号）。
     */
    private Integer status;

    /**
     * 地址。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    private String address;


    /**
     * 全局唯一。对于同一个服务商，不同应用获取到企业内同一个成员的open_userid是相同的，最多64个字节。仅第三方应用可获取
     */
    @JsonAlias("open_userid")
    private String openUserid;

    /**
     * 主部门
     */
    @JsonAlias("main_department")
    private Long mainDepartment;

    /**
     * 扩展属性，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    private ExtattrDTO extattr;

    /**
     * 员工个人二维码，扫描可添加为外部联系人(注意返回的是一个url，可在浏览器上打开该url以展示二维码)；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    @JsonAlias("qr_code")
    private String qrCode;

    /**
     * 对外职务，如果设置了该值，则以此作为对外展示的职务，否则以position来展示。代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    @JsonAlias("external_position")
    private String externalPosition;

    /**
     * 成员对外属性，字段详情见对外属性；代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    @JsonAlias("external_profile")
    private ExternalProfileDTO externalProfile;


    /**
     * 扩展属性，代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    @NoArgsConstructor
    @Data
    public static class ExtattrDTO {

        /**
         * 企业微信官方未说明该字段的意思
         */
        private List<AttrsDTO> attrs;


        /**
         * 企业微信官方未说明该字段的意思
         */
        @NoArgsConstructor
        @Data
        public static class AttrsDTO {

            /**
             * 企业微信官方未说明该字段的意思
             */
            private Integer type;

            /**
             * 企业微信官方未说明该字段的意思
             */
            private String name;

            /**
             * 企业微信官方未说明该字段的意思
             */
            private TextDTO text;

            /**
             * 企业微信官方未说明该字段的意思
             */
            private WebDTO web;


            /**
             * 企业微信官方未说明该字段的意思
             */
            @NoArgsConstructor
            @Data
            public static class TextDTO {

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                private String value;
            }


            /**
             * 企业微信官方未说明该字段的意思
             */
            @NoArgsConstructor
            @Data
            public static class WebDTO {

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                private String url;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                private String title;

            }
        }
    }


    /**
     * 成员对外属性，字段详情见对外属性；代开发自建应用需要管理员授权才返回；第三方仅通讯录应用可获取；对于非第三方创建的成员，第三方通讯录应用也不可获取
     */
    @NoArgsConstructor
    @Data
    public static class ExternalProfileDTO {

        /**
         * 企业微信官方未说明该字段的意思
         */
        @JsonAlias("external_corp_name")
        private String externalCorpName;

        /**
         * 企业微信官方未说明该字段的意思
         */
        @JsonAlias("wechat_channels")
        private WechatChannelsDTO wechatChannels;

        /**
         * 企业微信官方未说明该字段的意思
         */
        @JsonAlias("external_attr")
        private List<ExternalAttrDTO> externalAttr;


        /**
         * 企业微信官方未说明该字段的意思
         */
        @NoArgsConstructor
        @Data
        public static class WechatChannelsDTO {

            /**
             * 企业微信官方未说明该字段的意思
             */
            private String nickname;

            /**
             * 企业微信官方未说明该字段的意思
             */
            private Integer status;
        }


        /**
         * 企业微信官方未说明该字段的意思
         */
        @NoArgsConstructor
        @Data
        public static class ExternalAttrDTO {

            /**
             * 企业微信官方未说明该字段的意思
             */
            private Integer type;

            /**
             * 企业微信官方未说明该字段的意思
             */
            private String name;

            /**
             * 企业微信官方未说明该字段的意思
             */
            private TextDTO text;

            /**
             * 企业微信官方未说明该字段的意思
             */
            private WebDTO web;

            /**
             * 企业微信官方未说明该字段的意思
             */
            @JsonAlias("miniprogram")
            private MiniprogramDTO miniProgram;


            /**
             * 企业微信官方未说明该字段的意思
             */
            @NoArgsConstructor
            @Data
            public static class TextDTO {

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                private String value;
            }


            /**
             * 企业微信官方未说明该字段的意思
             */
            @NoArgsConstructor
            @Data
            public static class WebDTO {

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                private String url;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                private String title;

            }


            /**
             * 企业微信官方未说明该字段的意思
             */
            @NoArgsConstructor
            @Data
            public static class MiniprogramDTO {

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                private String appid;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                @JsonAlias("pagepath")
                private String pagePath;

                /**
                 * 企业微信官方未说明该字段的意思
                 */
                private String title;
            }
        }
    }
}
